/**
 * 认证状态管理 Slice
 * 使用 Redux Toolkit 管理用户认证相关的状态
 * 包括用户信息、加载状态和错误信息的管理
 */

// src/store/slices/authSlice.ts
import { createSlice, PayloadAction } from '@reduxjs/toolkit';

/**
 * 认证状态接口定义
 * @interface AuthState
 * @property {Object | null} userInfo - 用户信息对象，包含邮箱和token
 * @property {boolean} loading - 加载状态标志
 * @property {string | null} error - 错误信息
 */
interface AuthState {
    userInfo: {
        email: string;
        token?: string;
    } | null;
    loading: boolean;
    error: string | null;
}

/**
 * 初始状态
 * 设置认证状态的默认值
 */
const initialState: AuthState = {
    userInfo: null,
    loading: false,
    error: null,
};

/**
 * 创建认证状态切片
 * 包含以下操作：
 * - setUserInfo: 设置用户信息
 * - setLoading: 设置加载状态
 * - setError: 设置错误信息
 * - logout: 登出操作，清除用户信息
 */
const authSlice = createSlice({
    name: 'auth',
    initialState,
    reducers: {
        /**
         * 设置用户信息
         * @param state - 当前状态
         * @param action - 包含用户信息的动作
         */
        setUserInfo: (state, action: PayloadAction<AuthState['userInfo']>) => {
            state.userInfo = action.payload;
        },
        /**
         * 设置加载状态
         * @param state - 当前状态
         * @param action - 包含加载状态的布尔值
         */
        setLoading: (state, action: PayloadAction<boolean>) => {
            state.loading = action.payload;
        },
        /**
         * 设置错误信息
         * @param state - 当前状态
         * @param action - 包含错误信息的字符串
         */
        setError: (state, action: PayloadAction<string | null>) => {
            state.error = action.payload;
        },
        /**
         * 登出操作
         * 清除用户信息并移除本地存储
         * @param state - 当前状态
         */
        logout: (state) => {
            state.userInfo = null;
            localStorage.removeItem('userInfo');
        },
    },
});

// 导出 actions 和 reducer
export const { setUserInfo, setLoading, setError, logout } = authSlice.actions;
export default authSlice.reducer;